#1 可迭代对象iterable

#(1) 定义：具有__iter__函数的对象，可以返回迭代器对象。

message = "我们的大中国啊！好大的一个家！"
# for item in message:
#     print(item)

#我
#们
#的
#大
#中
#国
#啊
#！
#好
#大
#的
#一
#个
#家
#！

# 1.获取迭代器对象
iterator = message.__iter__()
# 2.获取下一个元素
while True:
    try:
        item = iterator.__next__()
        print(item)
        # 3.如果停止迭代则跳出循环
    except StopIteration:
        break

#我
#们
#的
#大
#中
#国
#啊
#！
#好
#大
#的
#一
#个
#家
#！

#练习1：创建列表,使用迭代思想,打印每个元素.

list01 = [1, 2, 3, 4, 5]

iterator02 = list01.__iter__()
while True:
    try:
        item = iterator02.__next__()
        print(item)
    except StopIteration:
        break

# 1
# 2
# 3
# 4
# 5

#练习2：创建字典,使用迭代思想,打印每个键值对.

tuple01 = {"a": 1, "b": 2, "c": 3}
iterator02 = tuple01.__iter__()
while True:
    try:
        item = iterator02.__next__()
        print(item + ":", tuple01[item])
    except StopIteration:
        break
# a: 1
# b: 2
# c: 3



#2 迭代器对象iterator

#自定义迭代器对象

class CarIter:
    def __init__(self,data):
        self.__data = data
        self.__index = -1
    
    def __next__(self):
        if self.__index == len(self.__data) -1:
            raise StopIteration()
        self.__index +=1
        return self.__data[self.__index]

    
class CarCont:
    def __init__(self):
        self.__car = []
    
    def add_car(self,car):
        self.__car.append(car)
        
    def __iter__(self):
        return CarIter(self.__car)
cont_car = CarCont()
cont_car.add_car("红旗")
cont_car.add_car("比亚迪")
cont_car.add_car("传祺")
cont_car.add_car("长安")

# for item in cont_car:
#     print(item)
    
# 红旗
# 比亚迪
# 传祺
# 长安
        
iterator03 = cont_car.__iter__()
while True:
    try:
        item = iterator03.__next__()
        print(item)
    except StopIteration:
        break

# 红旗
# 比亚迪
# 传祺
# 长安


#练习2：创建自定义range类，实现下列效果.
class MyRange:
    def __init__(self,id):
        self.__range = [*range(id)]
    def __iter__(self):
        return CarIter(self.__range)
    
for number in MyRange(5):
    print(number)# 0 1 2 3 4
    





